package com.ruoyi.module.xmd.gen;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.module.xmd.tool.WeChatAccessTokenUtils;
import com.ruoyi.module.xmd.tool.WeChatUtils;
import com.ruoyi.module.xmd.vo.MiniQrCodeParamVo;
import com.ruoyi.module.yzx.tool.QrCodeUtils;
import com.ruoyi.system.domain.YhGasCylinders;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.nio.charset.StandardCharsets;
import java.util.*;

import static com.ruoyi.module.yzx.controller.YzxGasCylindersController.co;

public class GenEwmMain {
    public static void main(String[] args) throws Exception {
        //基础定义
        String appid = "wxbd896c3ed0d0fbd8";
        String appsecret = "a92e92f53517993fe12be4ed80603d82";

        // 获取token json字符串
        String token = WeChatAccessTokenUtils.getAccessToken(appid, appsecret);
        System.out.println("token:" + token);

        // 循环生成
        int start_i = 55001;// 包含
        int end_i = 60001;// 不包含
        GenEwmMain genEwmMainnew  = new GenEwmMain();
        int img_i = 0;
        for(img_i = start_i;img_i < end_i;img_i++){
            System.out.println("开始生成第：" + img_i + "张");
            genEwmMainnew.GenEwm(img_i,token);
        }
    }

    public void GenEwm(int img_i,String token) throws Exception {

        // 获取小程序码
        MiniQrCodeParamVo paramVo = new MiniQrCodeParamVo();
        paramVo.setScene(img_i+"");
        paramVo.setPage("pages/sys/new/xmd/show");
        paramVo.setAutoColor(false);
        paramVo.setHyaline(false);
        byte[] img_byte = remoteWxApiCreateQrcode(token,paramVo);

        // 下载小程序码到本地路径
        // 将字节数组转换为图片
        ByteArrayInputStream bis = new ByteArrayInputStream(img_byte);
        BufferedImage image = ImageIO.read(bis);

        // 保存图片
        String imageFileName="C:\\ruoyi\\uploadPath\\download\\ERW\\"+ img_i +".jpg";
        File outputFile = new File(imageFileName);
        ImageIO.write(image, "jpg", outputFile);

        System.out.println("图片已保存,id:"+ img_i);
    }

    //这里返回base64 前端可以通过 <image src = "">直接展示
    public byte[] remoteWxApiCreateQrcode(String accessToken, MiniQrCodeParamVo paramVo) throws Exception {
        RestTemplate rest = new RestTemplate();
        String url = "";
        Map<String, Object> param = new HashMap<String, Object>();
        //获取路径,然后替换具体的参数
        String GET_WXA_CODE_UNLIMIT_URL = WeChatUtils.WEIXIN_EWM;
        url = GET_WXA_CODE_UNLIMIT_URL.replace("ACCESS_TOKEN", accessToken);
        // 输入参数 最大32字符
        param.put("scene", paramVo.getScene());
        // 路径 如果没有默认跳转到首页面微信小程序发布后才可以使用不能添加参数
        param.put("page", paramVo.getPage());
        // 二维码尺寸
        param.put("width", paramVo.getWidth());
        param.put("is_hyaline", paramVo.isHyaline()); // 是否需要透明底色， is_hyaline 为true时，生成透明底色的小程序码 参数仅对小程序码生效
        param.put("auto_color", paramVo.isAutoColor()); // 自动配置线条颜色，如果颜色依然是黑色，则说明不建议配置主色调 参数仅对小程序码生效
        // 颜色 auto_color 为 false 时生效，使用 rgb 设置颜色 例如 {"r":"xxx","g":"xxx","b":"xxx"}
        param.put("line_color", paramVo.getLineColor());
        // 是否发布 -----------------------------------------------------------------------------------------------------------------测试完要删
        // param.put("check_path", false);

        System.out.println("调用生成微信URL接口传参:" + param);
        MultiValueMap<String, String> headers = new LinkedMultiValueMap<String, String>();
        headers.put(HttpHeaders.CONTENT_TYPE, Collections.singletonList("application/json"));
        org.springframework.http.HttpEntity<Object> requestEntity = new org.springframework.http.HttpEntity<Object>(
                param, headers);
        ResponseEntity<byte[]> response = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class);

        // 返回的不是图片，则说明接口报错了
        if (!"image".equals(Objects.requireNonNull(response.getHeaders().getContentType()).getType())) {
            String str = new String(Objects.requireNonNull(response.getBody()), StandardCharsets.UTF_8);
            System.out.println("调用小程序生成微信永久小程序码报错，接口响应内容:{}" + str);
            JSONObject resultParams = JSON.parseObject(str);
            String errorCode = resultParams.getString("errcode");
            if (StringUtils.isNotBlank(errorCode)) {
                System.out.println("errorCode={}" + errorCode);
                /*if (ObjectUtil.equal("42001", errorCode) || ObjectUtil.equal("40001", errorCode) || ObjectUtil.equal("40014", errorCode)) {
                    // 强制设置wxMpConfigStorage它的access token过期了，这样在下一次请求里就会刷新access token
                    Lock lock = this.wxService.getWxMpConfigStorage().getAccessTokenLock();
                    lock.lock();
                    try {
                        if (StringUtils.equals(this.wxService.getWxMpConfigStorage().getAccessToken(), accessToken)) {
                            this.wxService.getWxMpConfigStorage().expireAccessToken();
                        }
                    } catch (Exception ex) {
                        this.wxService.getWxMpConfigStorage().expireAccessToken();
                    } finally {
                        lock.unlock();
                    }
                    if (this.wxService.getWxMpConfigStorage().autoRefreshToken()) {
                        return this.execute(paramVo);
                    }
                } else if (ObjectUtil.equal("-1", errorCode)) {
                    log.error("\n【请求地址】: {}\n【请求参数】：{}\n【错误信息】：{}", url, JSON.toJSONString(param), str);
                    throw new Exception(errorCode);
                } else {
                    log.error("\n【请求地址】: {}\n【请求参数】：{}\n【错误信息】：{}", url, JSON.toJSONString(param), str);
                    throw new Exception(str);
                }*/
            }
        }
        return response.getBody();
    }



}
